# 创建时间：2025/5/4 星期日 15:56
# 创建人：李德才


def func_a(num_a):
    def func_b(num_b):
        # 如果在函数中，想要对外部作用域的变量进行修改，需要使用nonlocal关键字声明
        # nonlocal num_a
        # num_a += 1
        print(f'func_a的参数为：{num_a}，func_b的参数为：{num_b}')
        return num_a + num_b

    return func_b


print(func_a(1)(2))

""" 闭包的陷阱 """


def func_c():
    func_list = []
    for i in range(1, 4):
        def func_d():
            print(f'i的值为：{i}')
            return i ** 2  # i 的平方

        func_list.append(func_d)
    return func_list


f1, f2, f3 = func_c()

""" 
这里看起来是输出 1, 4, 9，但是实际上输出的是 9, 9, 9，
这是因为 func_d 没有被调用，而是被添加到了 func_list 中，
当 func_c 执行完毕后，i 的值为 3，所以 func_d 中的 i 的值也为3，
所以当 func_d 被调用时，i 的值已经是 3，所以输出的是 9, 9, 9
"""
print(f1(), f2(), f3())



""" 解决闭包的陷阱 ，使用局部变量，无论 i 的值如何，func_f 中的 _i 的值已经被固定了"""
def func_e():
    func_list = []
    for i in range(1, 4):
        def func_f(_i = i): # 使用局部变量，将 i 的值传递给 _i
            print(f'_i的值为：{_i}')
            return _i ** 2  # i 的平方
        func_list.append(func_f)
    return func_list


f4, f5, f6 = func_e()
print(f4(), f5(), f6())